/**
 * @description Vuex模块：小程序基础公共配置、用户信息、是否已检查更新
 * @author yinzhi
 * @date 2025-03-04
 */
import { logger } from '@/utils/log.js'
import dayjs from 'dayjs/esm/index'
import { getDefaultHotelBaseInfo, getUserInfo } from '@/libs/api/baseApi.js'
export default {
    namespaced: true,
    state: {
        // 小程序基础公共配置
        systemInfo: {
            // 上方顶部安全区状态栏高度 单位px
            statusBarHeight: '',
            // 头部高度 ios:44px android:48px
            barHeight: 44,
            // 头部高度+顶部状态栏高度 单位px
            navBarHeight: 0,
            // 像素比
            rpxNum: 1,
            // 屏幕的宽高 单位px
            screenWidth: 0,
            screenHeight: 0,
            // 系统版本
            system: '',
            // 设备机型
            model: '',
            // 设备品牌
            brand: '',
            // 是否iphone x以上机型
            isIphoneX: false,
            // 底部安全区域 主要用于iphone x以上 单位px
            footBarHeight: 0
        },
        // 用户信息 后续可能会有配置用户信息页面，做暂时的存储
        userInfo: {
            avatar: '', //头像
            id: 0, //用户id
            mobile: '', //手机号码
            nickname: '微信用户' //用户名
        },
        // 小程序应用是否已检查更新
        isApplyUpdate: false,
        // 入住信息
        checkInInfo: {
            startDate: '', //入住日期 不管是否有开始时间 进入小程序时都需要判断一下，如果小于当天日期则直接更改成当天日期
            endDate: '', //离店日期
            roomAmount: 1, //房间数量 默认1
            adult: 1, //成人数量
            confirmhildren: 0, //儿童数量
            nightsCount: 1 //夜晚数量
        },
        // 当前是默认的铁道学院店酒店信息，后续多店开放时，需要根据选择的酒店更新当前信息
        hotelInfo: {
            id: '', //酒店id
            hotelNameZh: '长沙懿家酒店', //酒店名称
            addressName: '省政府铁道学院爱尔眼科地铁站店', //酒店别名
            addressZh: '湖南省长沙市天心区新开铺街道莲花山巷82-2号', //酒店地址
            longitude: '112.985129',
            latitude: '28.13786', //酒店经纬度信息 做平台的时候需要提示一下再腾讯地图去获取一下位置信息
            phone: '17352863890', // 客服电话
            calendarMonth: 13, // 月份数量
            coverImage: '' //酒店首图
        },
        // 用户定位选择信息 预留字段，等后续多门店开放时可能需要授权获取用户位置信息
        checkMapLocation: {
            longitude: '112.985129',
            latitude: '28.13786'
        }
    },
    getters: {
        systemInfo: state => state.systemInfo,
        userInfo: state => state.userInfo,
        isApplyUpdate: state => state.isApplyUpdate,
        checkInInfo: state => state.checkInInfo,
        hotelInfo: state => state.hotelInfo,
        checkMapLocation: state => state.checkMapLocation
    },
    mutations: {
        setIsApplyUpdate(state, bool) {
            state.isApplyUpdate = bool
        },
        // 小程序基础公共配置写入
        setSystemInfo(state, data) {
            state.systemInfo = data
        },
        // 用户信息写入
        setUserInfo(state, userInfo) {
            state.userInfo = userInfo
            uni.setStorageSync('userInfo', userInfo)
        },
        // 入住信息写入
        setCheckInInfo(state, checkInInfo) {
            state.checkInInfo = checkInInfo
            // 入住信息可不做长期储存。后续需要放开代码即可
            // uni.setStorageSync('checkInInfo', checkInInfo)
        },
        // 酒店信息写入
        setHotelInfo(state, hotelInfo) {
            state.hotelInfo = hotelInfo
            uni.setStorageSync('hotelInfo', hotelInfo)
        },
        // 用户定位选择信息写入
        setCheckMapLocation(state, checkMapLocation) {
            state.checkMapLocation = checkMapLocation
            uni.setStorageSync('checkMapLocation', checkMapLocation)
        }
    },
    actions: {
        // 初始化入住信息的时间设置
        initCheckInInfo({ state, commit }) {
            try {
                let checkInInfo = state.checkInInfo
                if (!checkInInfo?.startDate) {
                    //如果没有默认入住时间则设置当天为入住时间
                    checkInInfo = {
                        ...checkInInfo,
                        startDate: dayjs().format('YYYY-MM-DD')
                    }
                } else {
                    // 如果有入住时间，则判断是否大于当天时间，否则设置成当天时间
                    if (dayjs(checkInInfo.startDate).isBefore(dayjs())) {
                        checkInInfo = {
                            ...checkInInfo,
                            startDate: dayjs().format('YYYY-MM-DD')
                        }
                    }
                    if (dayjs(checkInInfo.endDate).isBefore(dayjs())) {
                        checkInInfo = {
                            ...checkInInfo,
                            endDate: dayjs().add(1, 'day').format('YYYY-MM-DD')
                        }
                    }
                }
                if (!checkInInfo?.endDate) {
                    checkInInfo = {
                        ...checkInInfo,
                        endDate: dayjs(checkInInfo.startDate).add(1, 'day').format('YYYY-MM-DD')
                    }
                } else {
                    // 如果有入住的离店时间，则判断离店时间是否大于入住时间，否则设置成入住时间的第二天
                    if (dayjs(checkInInfo.endDate).isBefore(dayjs(checkInInfo.startDate))) {
                        checkInInfo = {
                            ...checkInInfo,
                            endDate: dayjs(checkInInfo.startDate).add(1, 'day').format('YYYY-MM-DD')
                        }
                    }
                }
                let days = dayjs(checkInInfo.endDate).diff(checkInInfo.startDate, 'day')
                commit('setCheckInInfo', {
                    ...checkInInfo,
                    nightsCount: days > 0 ? days : ''
                })
            } catch (e) {
                logger.error('[initCheckInInfo] 小程序初始化入住信息失败: ', error)
            }
        },
        // 初始化获取酒店信息
        async initHotelInfo({ state, commit }) {
            try {
                const hotelInfo = await uni.getStorageSync('hotelInfo')
                await commit('setHotelInfo', hotelInfo)
                const data = await getDefaultHotelBaseInfo({
                    id: state.hotelInfo?.id || ''
                })
                const calendarMonth = data?.calendarMonth || 12
                await commit('setHotelInfo', {
                    ...data,
                    calendarMonth: calendarMonth + 1
                })
            } catch (error) {
                logger.error('[initHotelInfo] 初始化获取酒店信息: ', error)
            }
        },
        // 初始化用户位置信息
        async initPlatform({ state, commit, dispatch }) {
            try {
                await dispatch('initCheckInInfo')
                const checkMapLocation = await uni.getStorageSync('checkMapLocation')
                await commit('setCheckMapLocation', checkMapLocation || state.checkMapLocation)
                await dispatch('initHotelInfo')
                // 入住信息可做长期储存。后续需要放开代码即可
                // const checkInInfo = await uni.getStorageSync('checkInInfo')
                // await commit('setCheckInInfo', checkInInfo || state.checkInInfo)
                // 获取用户信息
                const userInfo = await uni.getStorageSync('userInfo')
                await commit('setUserInfo', userInfo || state.userInfo)
                const token = await uni.getStorageSync('token')
                if ((!userInfo || !userInfo.id) && token) {
                    const data = await getUserInfo()
                    await commit('setUserInfo', data)
                }
            } catch (e) {
                logger.error('[initLocation] 小程序初始化定位信息获取失败: ', e)
            }
        },
        // 获取坐标信息
        getMyLocation({ commit }) {
            return new Promise((resolve, reject) => {
                try {
                    uni.getLocation({
                        type: 'gcj02',
                        success: async res => {
                            commit('setCheckMapLocation', res)
                            resolve(res)
                        },
                        fail: e => {
                            uni.getSetting({
                                success(setting) {
                                    if (!setting.authSetting['scope.userLocation']) {
                                        reject('noLocation') //用户未授权
                                    } else {
                                        reject('noGPS') //用户未打开定位
                                    }
                                }
                            })
                        }
                    })
                } catch (error) {
                    logger.error('[getMyLocation] 小程序基础用户授权位置信息获取失败: ', error)
                }
            })
        },
        // 获取小程序基础公共配置
        getSystemInfo({ commit }) {
            try {
                uni.getSystemInfo({
                    success: e => {
                        let systemInfo = {}
                        // 判断手机型号是否为iphone x以上
                        const iphoneReg = /(^X|x\w)|(^1\d)|(^2\d)|(^3\d)/g
                        systemInfo.isIphoneX = false
                        if (e.model.includes('iPhone')) {
                            // 截取手机型号
                            let iphoneModel = e.model.slice(7)
                            if (iphoneReg.test(iphoneModel)) {
                                systemInfo.isIphoneX = true
                            }
                        }
                        systemInfo.statusBarHeight = e.statusBarHeight
                        systemInfo.barHeight =
                            e.platform == 'ios' || e.model.includes('iPhone') ? 44 : 48
                        systemInfo.navBarHeight = systemInfo.barHeight + e.statusBarHeight
                        systemInfo.rpxNum = e.screenWidth / 375
                        systemInfo.screenWidth = e.screenWidth //设置屏幕宽度
                        systemInfo.screenHeight = e.windowHeight //设置屏幕高度
                        systemInfo.system = e.system
                        systemInfo.model = e.model
                        systemInfo.brand = e.brand
                        systemInfo.footBarHeight = systemInfo.isIphoneX ? 20 : 0
                        commit('setSystemInfo', systemInfo)
                    },
                    fail: e => {
                        logger.error('[uni.getSystemInfo] 小程序基础公共配置获取失败: ', e)
                    }
                })
            } catch (error) {
                logger.error('[getSystemInfo] 小程序基础公共配置获取失败: ', error)
            }
        }
    }
}
